const express = require('express');
const morgan = require('morgan');
const userRoutes = require('./userRoutes');
const app = express();
require('dotenv').config();
const port = process.env.PORT || 3000; // 获取环境变量中的端口号，如果没有设置则使用默认值3000
const pool = require('./db'); // 导入数据库连接池

// 中间件：使用morgan中间件，记录HTTP请求日志
app.use(morgan('dev')); // 日志在控制台输出
// 中间件：解析JSON请求体（如POST请求中的JSON数据）
app.use(express.json());
app.use('/api', userRoutes); // 路由前缀为'/api

// 自定义错误处理中间件
app.use((err, req, res, next) => {
  console.error('发生错误：', err.message); // 输出错误信息
  console.error('堆栈跟踪：',err.stack); // 输出错误堆栈信息
  // 根据环境返回不同相应（开发环境显示详细错误，生产环境隐藏敏感信息）
  const environment = app.get('env'); // 获取当前环境（'development'或'production'）
  const erroMessage = environment === 'development' ? err.message : '服务器内部错误'; // 根据环境返回不同的错误信息
  
  res.status(err.status || 500).json({ // 返回错误响应，状态码为500（服务器内部错误），错误信息为erroMessage
    error: erroMessage, // 返回错误信息
    code: err.code || 'INTERNAL_SERVER_ERROR', // 返回错误代码，默认为'INTERNAL_SERVER_ERROR'
  });
});
// 路由：处理根路径的GET请求，返回Hello, Express!
app.get('/', (req, res) => {
  res.send('Hello, Express!');
});

// 路由：处理/api/hello路径的GET请求，返回Hello, API!
app.get('/api/hello', (req, res) => {
  res.json({ message: 'Hello, API! 大威天龙！！！' });
});

// 路由：处理/api/greet路径的POST请求，返回Hello, <name>!
app.post('/api/greet', (req, res) => {
  const { name } = req.body; // 从请求体中获取name参数
  res.json({ message: `Hello, ${name}!` });
});

// 路由：处理/api/add路径的post请求，接收两个参数a，b，返回他们的和
app.post('/api/add',(req,res)=>{
    const {a,b} = req.body;
    res.json(a+b);
});

// /api/products 接口，查询数据库中的所有产品信息
app.get('/api/products', async (req, res) => {
    try {
      const [rows] = await pool.query('SELECT * FROM products'); // 执行SQL查询语句
      res.json({
        data:rows,
        message: '查询产品信息成功'
      }); // 将查询结果以JSON格式返回
    } catch (err) {
      console.error('查询产品信息时出错:', err);
      res.status(500).json({ error: '查询产品信息时出错' });
    }
});
// post接口，添加产品信息到数据库中
app.post('/api/products', async (req, res) => {
  // INSERT INTO products (name, price, description) VALUES('iPhone 13', 5999.00, 'Apple最新款手机')示例
  const { name, price, description } = req.body; // 从请求体中获取产品信息
  try {
    const [result] = await pool.query('INSERT INTO products (name, price, description) VALUES (?, ?, ?)', [name, price, description]); // 执行SQL插入语句
    res.json({
      id: result.insertId, // 返回插入的产品ID
      message: '添加产品信息成功'
    });
  }
  catch (err) {
    console.error('添加产品信息时出错:', err);
    res.status(500).json({ error: '添加产品信息时出错' });
  }
})

// 启动服务器，监听指定端口
app.listen(port, () => {
  console.log(`服务器已启动，监听端口 ${port}`)
});

app.use(express.static('public')); // 静态文件目录为public